#ifndef SMOOTHER
#define SMOOTHER
//------------------------------------------------------------------------
//  Name: Smoother.h
//
//  Desc: Template class to help calculate the average value of a history
//        of values. This can only be used with types that have a 'zero'
//        value and that have the += and / operators overloaded.
//
//        Example: Used to smooth frame rate calculations.
//------------------------------------------------------------------------
#include <vector>

template <class T>
class Smoother
{
public:

    //to instantiate a Smoother pass it the number of samples you want
    //to use in the smoothing, and an exampe of a 'zero' type
    Smoother(int SampleSize, T ZeroValue):m_History(SampleSize, ZeroValue),
                                                                        m_ZeroValue(ZeroValue),
                                                                        m_iNextUpdateSlot(0)
    {
    }

    //each time you want to get a new average, feed it the most recent value
    //and this method will return an average over the last SampleSize updates
    T update(const T& MostRecentValue)
    {  
        //overwrite the oldest value with the newest
        m_History[m_iNextUpdateSlot++] = MostRecentValue;

        //make sure m_iNextUpdateSlot wraps around. 
        if (m_iNextUpdateSlot == m_History.size()) m_iNextUpdateSlot = 0;

        //now to calculate the average of the history list
        T sum = m_ZeroValue;

        std::vector<T>::iterator it = m_History.begin();

        for (it; it != m_History.end(); ++it)
        {
            sum += *it;
        }

        return sum / (double)m_History.size();
    }

private:
    //this holds the history
    std::vector<T>  m_History;

    int m_iNextUpdateSlot;

    //an example of the 'zero' value of the type to be smoothed. This
    //would be something like Vector2D(0,0)
    T m_ZeroValue;
    
};


#endif